iT邦幫忙

2

🧩 Git 中文檔名與分支管理疑難雜症筆記

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20250618/20155103915phop6ll.png

🧵 一次嘗試批次忽略檔案的奇遇記

我在清理專案追蹤檔案時,遇到一個看似簡單的 Git 指令,卻意外觸發了一連串關於編碼與路徑的問題。

原本打算透過這行指令,快速忽略 .gitignore 中標記過但仍被追蹤的檔案:

git ls-files -ci --exclude-from=.gitignore | ForEach-Object { git update-index --assume-unchanged $_ }

結果遇到一堆 fatal 錯誤,顯示某些檔案無法標記為不變更。這些錯誤,多半集中在含有中文路徑或奇怪符號的檔案上。

🧪 常見錯誤與對應解法:逐一破解

問題狀況 解法建議
PowerShell 無法正確處理 Git 輸出的中文編碼 明確設定 $OutputEncoding = [System.Text.Encoding]::UTF8,或改用 Git Bash 處理管線
fatal: Unable to mark file 很可能是檔名過長、非法字元,或是 Windows 不支援的 NTFS 組合字元
merge 後分支被 GitLab 自動刪除 不是 Maintainer 時,合併時請取消「Delete source branch」選項,或手動備份分支
Draft Merge Request 不會保留分支? Draft 只會阻止提前合併,並不會阻止合併後刪除分支行為

🛠 實用指令筆記整理

✅ 驗證中文編碼是否正常顯示

$OutputEncoding = [System.Text.Encoding]::UTF8
git ls-files -ci --exclude-from=.gitignore

✅ 使用 Git Bash 忽略檔案(避免 PowerShell 的亂碼問題)

git ls-files -ci --exclude-from=.gitignore | xargs -I{} git update-index --assume-unchanged "{}"

✅ 找出造成問題的檔案

git ls-files -ci --exclude-from=.gitignore | while read file; do
  echo "處理中:$file"
  git update-index --assume-unchanged "$file" || echo "⚠️ 無法處理:$file"
done

🧠 GitLab Merge 的分支保護小技巧

  • 「Draft:」或「WIP:」可避免同事不小心提早 Merge,但不會自動保留你的分支。
  • 若不想分支被刪除,請:
    1. Merge 前取消勾選「Delete source branch」
    2. 建立備份分支:git checkout -b LSG-backup
  • 想更穩定?可搭配腳本備份命名:LSG-backup-$(Get-Date -Format yyyyMMddHHmm)

🚧 「Draft:」或「WIP:」標題的使用情境

在 GitLab 建立 Merge Request(MR)時,若尚未完成開發,建議將標題開頭加上:

  • Draft: 新功能開發中
  • WIP: 尚在調整,不可合併
行為 結果
標題含 Draft: 或 WIP: GitLab 將禁止合併,Merge 按鈕呈現灰色
CI/CD 測試 仍可正常執行
Review 留言與討論 仍可進行
想解除 Draft 狀態 只要修改標題,刪除 Draft: 前綴即可

📌 這是團隊內溝通「我還沒準備好合併」的非語言提示。也可以搭配 Review 流程,避免提早被他人合併,造成 branch 遺失風險。

🧵 適合詢問 GPT 的 Prompt

當我使用 git ls-files 搭配 --exclude-from=.gitignore 遇到中文檔名亂碼,要怎麼解決?

如何判斷 git update-index 失敗的原因是編碼、檔名過長,還是 Windows 不支援?

我在 GitLab 被自動刪除分支,但我不是專案 Maintainer,有什麼方式可以避免?

圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言